package com.company.exp2.timeLine;

import com.company.exp2.context.Context;
import com.company.exp2.event.Event;
import com.company.exp2.typeEnum.EventType;

/**
 * @author dyy
 *
 * TimeLine 模拟整个模型的时间线
 * 必须保证 TimeLine 在多线程环境下的同步 synchronization
 * TimeLine 会用一个成员来指向当前环境的实例
 *
 */
public abstract class TimeLine {

    public TimeLine() {
    }

    /**
     * 时间线的执行流程
     * 不断获取下一个发生的事件，并将其交给执行器处理
     */
    public void start() {
        while (hasNextEvent()) {
            Event event = getNextEvent();
            resignFirstEvent();
            if (event.isValid()) {
                event.occur();
            }
        }
    }

    /**
     * 向时间线注册事件
     * @param event 注册的事件
     */
    public abstract void announceAnEvent(Event event);

    /**
     * 当前时间线上是否存在一个有效的事件
     * @return true 当时间线上存在事件时 ; false 当时间线上不存在事件时
     */
    protected abstract boolean hasNextEvent();

    /**
     * 获取下一个将会发生的事件
     *      nullable * 如果没有检测是否含有下一个事件，返回值可能为 null
     * @return Event 下一个发生的事件
     */
    protected abstract Event getNextEvent();

    /**
     *  将时间线上当前第一个事件移出时间线
     */
    protected abstract void resignFirstEvent();

}
